#ifndef _EVENT_BOARD_H_
#define _EVENT_BOARD_H_

#include <config.h>
#include <stdbool.h>
// #include "log_api.h"
// #include "basic_app.h"
#include "protocol_api.h"
// #include "cardholder_api.h"

// 事件携带数据长度
#define EVENT_CARRYING_DATA_LENGTH                      (20ul)
// 有效密钥长度
#define VALID_KEY_LENGTH                                (USER_AUTHENTICATION_KEY_LENGTH)

// 设备待机工作时间   - 5s
#define DEVICE_STANDBY_TIME                             (5ul)
// 时间补偿          - 5s
#define REGISTER_TIME_BASED_COMPENSATION                (5ul)

// 低压电压阈值
#define EVENT_LOW_VOLTAGE_THRESHOLD                     (5ul)

/**
 * @brief 自检任务启动结果
 *
 */
typedef enum
{
  SELF_TEST_NO_SUPPORT,    // 不支持
  SELF_TEST_START_ERROR,   // 错误
  SELF_TEST_START_SUCCESS, // 成功
} SelfTestStartResult_t;

/**
 * @brief 设备重置任务启动结果
 *
 */
typedef enum
{
  RESET_NO_SUPPORT,    // 不支持
  RESET_START_ERROR,   // 错误
  RESET_START_SUCCESS, // 成功
} ResetStartResult_t;

/**
 * @brief 报文发送状态
 *
 */
typedef enum
{
  SEND_STATUS_IDLE,        // 空闲
  SEND_STATUS_DONE,        // 完成 
  SEND_STATUS_ERROR,       // 失败
  SEND_STATUS_HOST_NO_ACK, // 主机无应答
} EventSendStatus_t;

/**
 * @brief 注册用户结果
 *
 */
typedef enum
{
  REGISTER_USER_IDLE,               // 空闲
  REGISTER_USER_EXIT,               // 退出
  REGISTER_USER_START,              // 启动
  REGISTER_USER_ERROR,              // 注册失败
  REGISTER_USER_TIMEOUT,            // 注册超时
  REGISTER_USER_SUCCESS,            // 注册成功
  REGISTER_USER_FILE_ERROR,         // 文件错误
  REGISTER_USER_DEVICE_BUSY,        // 设备繁忙
  REGISTER_SAFETY_USER_IS_FULL,     // 外部模组用户已满
  REGISTER_USER_SINGLE_USER_LIMIT,  // 超过单用户注册上限
  REGISTER_USER_KEY_ALREADY_EXISTS, // 密钥已存在
  REGISTER_USER_DEVICE_NOT_SUPPORT, // 设备不支持
  REGISTER_USER_CARDHOLDER_IS_FULL, // 持卡人已满
  REGISTER_USER_SUCCESS_WAIT_SAVE,  // 注册成功，等待保存
} RegisterResult_t;

/**
 * @brief 门锁动作
 *
 */
// typedef enum
// {
//   // DOOR_ACTION_LOCK        = MOTOR_LOCK,          // 上锁
//   // DOOR_ACTION_UNLOCK      = MOTOR_UNLOCKING,     // 解锁
//   // DOOR_ACTION_NORMAL_OPEN = MOTOR_NORMALLY_OPEN, // 常开
// } DoorAction_t;

/**
 * @brief 用户鉴权结果
 *
 */
// typedef enum
// {
//   // USER_FORBIDDEN              = CARDHOLDER_FORBIDDEN,
//   // USER_OUT_OF_DATE            = CARDHOLDER_OUT_OF_DATE,
//   // USER_AUTHECTICATION_ERROR   = CARDHOLDER_AUTHECTICATION_ERROR,
//   // USER_AUTHENTICATION_SUCCESS = CARDHOLDER_AUTHENTICATION_SUCCESS,
// } UserAuthenticationResult_t;

/**
 * @brief 密钥类型
 *
 */
// typedef enum
// {
//   // KEY_TYPE_CARD                   = CARD_AUTHENTICATION,                   // 卡片
//   // KEY_TYPE_KEYBOARD               = PASSWORD_AUTHENTICATION,               // 密码
//   // KEY_TYPE_QRCODE                 = QRCODE_AUTHENTICATION,                 // 二维码
//   // KEY_TYPE_FINGER                 = FINGER_PRINTF_AUTHENTICATION,          // 指纹
//   // KEY_TYPE_FACE                   = FACE_ID_AUTHENTICATION,                // 人脸特征值
//   // KEY_TYPE_COMMAND_REMOTE         = COMMAND_REMOTE_AUTHENTICATION,         // 命令开锁
//   // KEY_TYPE_BLUETOOTH_VIRTUAL_CARD = BLUETOOTH_VIRTUAL_CARD_AUTHENTICATION, // 蓝牙虚拟卡
//   // KEY_TYPE_EXIT_BUTTON            = 0xFE,                                  // 出门按钮
//   // KEY_TYEP_UNKOWN                 = 0xFF,                                  // 未知
// } EventKeyType_t;

/**
 * @brief 本地注册结果
 *
 */
typedef enum
{
  LOCAL_REGISTER_RESULT_IDLE                = LOCAL_REGISTER_STATUS_IDLE,                // 空闲
  LOCAL_REGISTER_RESULT_BUSY                = LOCAL_REGISTER_STATUS_BUSY,                // 正在进行
  LOCAL_REGISTER_RESULT_DONE                = LOCAL_REGISTER_STATUS_DONE,                // 完成
  LOCAL_REGISTER_RESULT_ERROR               = LOCAL_REGISTER_STATUS_ERROR,               // 失败
  LOCAL_REGISTER_RESULT_USER_EXIT           = LOCAL_REGISTER_STATUS_USER_EXIT,           // 用户退出
  LOCAL_REGISTER_RESULT_DEVICE_BUSY         = LOCAL_REGISTER_STATUS_DEVICE_BUSY,         // 设备繁忙
  LOCAL_REGISTER_RESULT_SINGLE_USER_LIMIT   = LOCAL_REGISTER_STATUS_SINGLE_USER_LIMIT,   // 超过用户上限
  LOCAL_REGISTER_RESULT_KEY_ALREADY_EXISTS  = LOCAL_REGISTER_STATUS_KEY_ALREADY_EXISTS,  // 密钥已存在
  LOCAL_REGISTER_RESULT_DEVICE_NOT_SUPPORT  = LOCAL_REGISTER_STATUS_DEVICE_NOT_SUPPORT,  // 设备不支持
  LOCAL_REGISTER_RESULT_CARDHOLDER_IS_FULL  = LOCAL_REGISTER_STATUS_CARDHOLDER_IS_FULL,  // 持卡人已满
  LOCAL_REGISTER_RESULT_SAFETY_USER_IS_FULL = LOCAL_REGISTER_STATUS_SAFETY_USER_IS_FULL, // 外部模组用户已满
  LOCAL_REGISTER_RESULT_WAIT_SAVE           = LOCAL_REGISTER_STATUS_WAIT_SAVE,           // 录取成功，待保存
} LocalRegisterResult_t;

/**
 * @brief 开锁类型
 *
 */
// typedef enum
// {
//   // EVENT_UNLOCK_CARD                   = LOG_PHYSICAL_CARD_NUMBER,
//   // EVENT_UNLOCK_FACE                   = LOG_FACE_SCANF,
//   // EVENT_UNLOCK_QRCODE                 = LOG_QR_CODE_SCANF,
//   // EVENT_UNLOCK_FINGER                 = LOG_FINGER_SCANF,
//   // EVENT_UNLOCK_PASSWORD               = LOG_USER_KEYSCANF_PASSWORD,
//   // EVENT_UNLOCK_EXIT_BUTTON            = LOG_EXIT_BUTTON,
//   // EVENT_UNLOCK_COMMAND_OPEN_DOOR      = LOG_COMMAND_OPEN_DOOR,
//   // EVENT_UNLOCK_BLUETOOTH_VIRTUAL_CARD = LOG_BLUETOOTH_VIRTUAL_CARD_NUMBER,

//   // EVENT_ALARM_NORMAL_OPEN             = LOG_NORMAL_OPEN,
//   // EVENT_ALARM_ANTI_SKID               = LOG_ANTI_SKID_ALARM,
//   // EVENT_ALARM_FALSE_LOCK              = LOG_FALSE_LOCK_ALARM,
//   // EVENT_ALARM_DOUBLE_LOCK             = LOG_DOUBLE_LOCK_ALARM,
//   // EVENT_ALARM_KEY_IN                  = LOG_UNLOCK_WITH_KEY,
// } EventUnlock_t;

/**
 * @brief 事件中心事件类型
 *
 */
typedef enum
{
  TASK_SCHEDULE             = 1 << 0, // 任务调度
  SCHEDULED_TASK            = 1 << 1, // 定时任务
  DEVICE_REBOOT_LISTER      = 1 << 2, // 设备重启
  RESTORE_RESULT_LISTER     = 1 << 3, // 恢复出厂
  SYSTEM_FIRMWARE_UPDATE    = 1 << 4, // 固件更新
  DEVICE_SELF_TEST_LISTER   = 1 << 5, // 设备自检
} EventCenterTypeOfEvent_t;

// 任务调度
typedef void (*EventTaskSchedule_t)(void);
// 定时任务
typedef void (*EventScheduledTask_t)(void);
// 设备重启任务
typedef void (*EventDeviceRebootTask_t)(void);
// 恢复出厂任务
typedef void (*EventRestoreFactoryTask_t)(void);
// 固件更新任务
typedef void (*EventFirmwareUpdateTask_t)(void);
// 设备自检
typedef void (*EventDeviceSelfTestTask_t)(void);
// 开外部信号源任务
typedef void (*EventEnableSignalSourceTask_t)(void);
// 在线注册用户定时
typedef void (*EventOnlineRegisterListerTimer_t)(void);

/**
 * @brief 注册用户信息
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t Count;                                             // 次数
  uint32_t KeyToken;                                         // 唯一编码
  uint8_t NumberOfKey;                                       // 密钥长度
  uint8_t AuthenticationType;                                // 密钥类型
  uint8_t UserName[USER_NAME_LENGTH];                        // 用户名
  uint8_t AuthenticationKey[USER_AUTHENTICATION_KEY_LENGTH]; // 鉴权密钥

  uint8_t Date;                        // 日期
  uint32_t EndTimestamp;               // 结束时间
  uint32_t StartTimestamp;             // 开始时间
  uint8_t StartHour[MAX_TIME_SLOTS];   // 开始时
  uint8_t StartMinute[MAX_TIME_SLOTS]; // 开始分
  uint8_t EndHour[MAX_TIME_SLOTS];     // 结束时
  uint8_t EndMinute[MAX_TIME_SLOTS];   // 结束分
} RegisterKeyInformation_t;

/**
 * @brief 在线注册信息
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t Source;                          // 注册源
  uint8_t CheckCode;                       // 校验码
  uint32_t FileSize;                       // 文件总大小
  uint8_t NumberOfRemainingFile;           // 文件总数量
  RegisterKeyInformation_t KeyInformation; // 密钥信息
} OnlineRegisterInformation_t;

/**
 * @brief 验证密钥字段内容
 *
 */
typedef struct
{
  uint8_t KeyType;                          // 密钥类型
  uint8_t NumberOfKey;                      // 密钥长度
  uint8_t KeyValue[TYPE_THE_LENGTH_OF_KEY]; // 键值
} VerifyKeyFormat_t;

/**
 * @brief 验证管理员密钥字段内容
 *
 */
typedef struct
{
  uint8_t NumberOfKey;                   // 密钥长度
  char KeyValue[TYPE_THE_LENGTH_OF_KEY]; // 键值
} VerifyAdminPasswordFormat_t;

/**
 * @brief 在线注册用户结果
 *
 */
typedef struct __attribute__((aligned(4)))
{
  RegisterResult_t Result;              // 结果
  RegisterKeyInformation_t Information; // 信息
} OnlineRegisterResultFormat_t;

/**
 * @brief 推送事件字段格式
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint16_t LogId;
  uint8_t LogType;
  uint8_t AttaParameter[USER_AUTHENTICATION_KEY_LENGTH];
} PushEventFormat_t;

/**
 * @brief 推送警报事件格式
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint16_t LogId;   // 日志ID
  uint8_t LogType;  // 日志类型
  uint8_t TiggerEn; // 触发标识
} PushAlarmEventFormat_t;

/**
 * @brief 报文发送状态
 *
 */
typedef struct
{
  uint8_t Status; // 发送状态
} EventMessageSendStatus_t;

/**
 * @brief 输入的管理员密码
 *
 */
typedef struct
{
  uint8_t Password[NUMBER_OF_KEYBOARD_KEY]; // 管理员密码
} TypedAdminPassword_t;

/**
 * @brief 开锁方式字段内容
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t KeyType;                                  // 密钥类型
  uint8_t UnlockingMethod;                          // 开锁方式
  uint8_t AuthorizationExpirationTime[4];           // 授权终止时间
  uint8_t KeyValue[USER_AUTHENTICATION_KEY_LENGTH]; // 密钥值
} UnlockingMethodFormat_t;

/**
 * @brief 事件报文
 *
 */
typedef struct
{
  uint8_t Type;                                   // 事件类型
  uint8_t DataPacket[EVENT_CARRYING_DATA_LENGTH]; // 附带数据
} EventPacket_t;

/**
 * @brief 外部调用方法
 *
 */
typedef struct
{
  EventTaskSchedule_t TaskSchedule;             // 定时任务
  EventScheduledTask_t ScheduledTask;           // 计划任务
  EventDeviceRebootTask_t DeviceRebootTask;     // 设备重启任务
  EventRestoreFactoryTask_t RestoreFactoryTask; // 恢复出厂任务
  EventFirmwareUpdateTask_t FirmwareUpdateTask; // 固件更新任务
  EventDeviceSelfTestTask_t DeviceSelfTestTask; // 设备自检任务
} EventCenterExternalInterfaces_t;

/**
 * @brief 毫秒延时
 * 
 * @param Ms - 延时的时间
 */
extern void EventDelayMs(uint32_t Ms);

/**
 * @brief 实时时间初始化
 *
 */
extern void EventRealTimeInitialization(void);

/**
 * @brief 获取当前时间（时间戳）
 *
 * @return uint32_t - 当前时间（时间戳）
 */
extern uint32_t EventGetCurrectTimestamp(void);

/**
 * @brief 获取 RFID 功能使能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetRfidFunctionEnable(void);

/**
 * @brief 获取键盘功能使能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetKeyboardFunctionEnable(void);

/**
 * @brief 获取外部验证模组功能使能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetSafetyFunctionEnable(void);

/**
 * @brief 获取网络功能使能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetNetwokFunctionEnable(void);

/**
 * @brief 获取睡眠功能失能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetSleepFunctionEnable(void);

/**
 * @brief 获取电压采样使能位
 *
 * @return bool - 使能标识（true：开启 false：关闭）
 */
extern bool EventGetBatteryFunctionEnableBit(void);

/**
 * @brief 获取外部验证使能位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetExternalValidationFunctionEnableBit(void);

/**
 * @brief 获取播报功能控制位
 *
 * @return bool - 开启状态（true：开启 false：关闭）
 */
extern bool EventGetDayBroadcastContorlEn(void);

/**
 * @brief 获取开始播报天数
 *
 * @return uint8_t - 起始播报天数
 */
extern uint8_t EventGetBroadcastRemainingDays(void);

/**
 * @brief 获取常开提示间隔时间
 *
 * @return uint8_t - 提示间隔时间
 */
extern uint8_t EventGetNormalOpenTipInterval(void);

/**
 * @brief 获取心跳上报间隔时间
 *
 * @return uint16_t - 间隔时间
 */
extern uint16_t EventGetHeartbeatReportingInterval(void);

/**
 * @brief 获取用户动作时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t EventUserActionTimeout(void);

/**
 * @brief 获取注册超时时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t EventRegisterTimeout(void);

/**
 * @brief 获取离合器是否已闭合
 *
 * @return bool - 状态（true：闭合 false：打开）
 */
extern bool EventGetWhetherTheClutchIsClosed(void);

/**
 * @brief 获取假锁触发标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool EventGetFlaseLockAlarmEn(void);

/**
 * @brief 获取防撬警报标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool EventGetAntiPickingAlarmEn(void);

/**
 * @brief 获取反锁使能标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool EventGetLockedInEn(void);

/**
 * @brief 获取斜舌触发标识
 *
 * @return bool - 触发标志（true：触发 false：静默）
 */
extern bool EventGetObliqueTongueTiggerEn(void);

/**
 * @brief 获取门常开使能标识
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetDoorNormalOpenEn(void);

/**
 * @brief 获取反锁提示间隔时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t EventGetLockedInReminderInterval(void);

/**
 * @brief 获取常开事件间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t EventGetNormalOpenReminderInterval(void);

/**
 * @brief 获取假锁警报间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t EventGetFalseLockAlarmAlertInterval(void);

/**
 * @brief 获取撬锁警报间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t EventGetTheBreakInAlarmAlertInterval(void);

/**
 * @brief 获取外部模组繁忙标志
 *
 * @return bool - 繁忙标识（true：繁忙 false：空闲）
 */
extern bool EventGetSafatyModuleBusyEn(void);

/**
 * @brief 或者网络模组空闲标志
 *
 * @return bool - 空闲标识（true：空闲 false：繁忙）
 */
extern bool EventGetNetworkModuleIdleEn(void);

/**
 * @brief 获取设备激活状态
 *
 * @return bool - 激活状态（true：激活 false: 未激活）
 */
extern bool EventGetDeviceActivationStatus(void);

/**
 * @brief 标志固件更新使能
 *
 */
extern void EventFlagFirmwareUpdateEnable(void);

/**
 * @brief 获取授权到期标志
 *
 * @return bool - 到期标准（true：到期 false：未到期）
 */
extern bool EventGetAuthorizationExpirationEn(void);

/**
 * @brief 获取开锁时间
 *
 * @return uint8_t - 开锁时间
 */
extern uint8_t EventGetUnlockTime(void);

/**
 * @brief 获取检索超时时间
 *
 * @return uint8_t - 检索超时时间
 */
extern uint8_t EventGetSearchTimeout(void);

/**
 * @brief 获取设备最后一次操作时间
 *
 * @return uint32_t - 操作时间
 */
extern uint32_t EventGetDeviceLastActionTime(void);

/**
 * @brief 设置设备最后一次操作时间
 *
 */
extern void EventSetDeviceLastActionTime(void);

/**
 * @brief 获取设备待机时间
 *
 * @return uint8_t - 待机时间
 */
extern uint8_t EventGetDeviceStandbyTime(void);

/**
 * @brief 获取系统锁定时间
 * 
 * @return uint8_t - 锁定时间
 */
extern uint8_t EventGetSystemLockedTime(void);

/**
 * @brief 获取特定密钥类型是否需要鉴权错误提示使能
 * 
 * @param Type  - 密钥类型
 * @return bool - 使能位（true：使能 false：失能）
 */
extern bool EventGetTragetTypeAuthenticationErrorEn(uint8_t Type);

/**
 * @brief 启动 RFID 自检任务
 *
 * @return SelfTestStartResult_t - 启动结果
 */
extern SelfTestStartResult_t EventStartRfidSelfTest(void);

/**
 * @brief 启动键盘自检任务
 *
 * @return SelfTestStartResult_t - 启动结果
 */
extern SelfTestStartResult_t EventStartKeyboardSelfTest(void);

/**
 * @brief 启动外部验证模组自检任务
 *
 * @return SelfTestStartResult_t - 启动结果
 */
extern SelfTestStartResult_t EventStartSafetySelfTest(void);

/**
 * @brief 启动无线模组自检任务
 *
 * @return SelfTestStartResult_t - 启动结果
 */
extern SelfTestStartResult_t EventStartNetworkSelfTest(void);

/**
 * @brief 启动外部验证模组重置任务
 *
 * @return ResetStartResult_t - 启动状态
 */
extern ResetStartResult_t EventStartSafetyReset(void);

/**
 * @brief 启动无线模组重置任务
 *
 * @return ResetStartResult_t - 启动状态
 */
extern ResetStartResult_t EventStartNetworkReset(void);

/**
 * @brief 启动卡片本地注册
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool EventStartRfidLocalRegister(void);

/**
 * @brief 启动键盘本地注册
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool EventStartKeyboardLocalRegister(void);

/**
 * @brief 启动外部验证模组本地注册
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool EventStartSafetyLocalRegister(void);

/**
 * @brief 启动读卡任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool EventStartReadCardTask(void);

/**
 * @brief 启动键盘本地注册退出监听任务
 *
 */
extern void EventStartKeyboardLocalRegisterExitListerTask(void);

/**
 * @brief 启动电池电压采样
 *
 */
extern void EventBatteryStartGetPercentageOfElectricity(void);

/**
 * @brief 获取电池电压百分比
 *
 * @return uint8_t - 电压百分比
 */
extern uint8_t EventGetVoltagePercentage(void);

/**
 * @brief 键盘进入睡眠模式
 *
 */
extern void EventKeyboardIntoSleepMode(void);

/**
 * @brief 键盘进入待机模式
 *
 */
extern void EventKeyboardIntoStandbyMode(void);

/**
 * @brief 启动键入管理员密码
 *
 */
extern void EventStartKeyInAdminPasswordMode(void);

/**
 * @brief 键盘进入验证用户权限模式
 *
 */
extern void EventKeyboardIntoVerifyUserPermissionMode(void);

/**
 * @brief 提示退出设备锁定
 *
 */
extern void EventPlayExitDeviceLockedState(void);

/**
 * @brief 提示设备已锁定
 *
 */
extern void EventPlayDeviceLocked(void);

/**
 * @brief 显示启动设备自检
 *
 */
extern void EventPlayStartDevSelfTest(void);

/**
 * @brief 提示退出设备自检
 *
 */
extern void EventPlayExitDevSelfTest(void);

/**
 * @brief 显示退出在线注册模式
 *
 */
extern void EventPlayExitOnlineRegisterMode(void);

/**
 * @brief 显示用户键入键值
 *
 */
extern void EventPlayStartUserTypedKey(void);

/**
 * @brief 显示退出按键输入
 *
 */
extern void EventPlayExitKeyEntry(void);

/**
 * @brief 提示门锁常开
 *
 */
extern void EventPlayDoorNormalOpen(void);

/**
 * @brief 提示退出外部安全模组鉴权
 *
 */
extern void EventPlayExitSafetyModuleAuthentication(void);

/**
 * @brief 提示启动外部安全模组鉴权
 *
 */
extern void EventPlayStartSafetyModuleAuthentication(void);

/**
 * @brief 提示退出本地注册模式
 *
 */
extern void EventPlayExitLocalRegistration(void);

/**
 * @brief 提示启动本地注册
 *
 */
extern void EventPlayStartLocalRegistration(void);

/**
 * @brief 提示钥匙插入
 *
 */
extern void EventPlayKeyInstall(void);

/**
 * @brief 提示钥匙拔出
 *
 */
extern void EventPlayKeyRemove(void);

/**
 * @brief 提示防撬警报触发
 *
 */
extern void EventPlayAutiPickingTigger(void);

/**
 * @brief 提示防撬警报恢复
 *
 */
extern void EventPlayAutiPickingRecovered(void);

/**
 * @brief 提示门处于常开状态
 *
 */
extern void EventPlayNormalOpenTigger(void);

/**
 * @brief 提示门常开已恢复
 *
 */
extern void EventPlayNormalOpenRecovered(void);

/**
 * @brief 提示假锁警报触发
 *
 */
extern void EventPlayFalseLockAlarmTigger(void);

/**
 * @brief 提示假锁警报恢复
 *
 */
extern void EventPlayFalseLockAlarmRecovered(void);

/**
 * @brief 提示门处于反锁状态
 *
 */
extern void EventPlayLockedInAlarmTigger(void);

/**
 * @brief 提示门反锁恢复
 *
 */
extern void EventPlayLockedInAlarmRecovered(void);

/**
 * @brief 提示设备上电
 * 
 */
extern void EventPlayDevicePowerup(void);

/**
 * @brief 提示系统启动
 *
 */
extern void EventPlayStartup(void);

/**
 * @brief 提示设备反锁
 *
 */
extern void EventPlayDeciceAutiLock(void);

/**
 * @brief 提示卡片已顶替
 *
 */
extern void EventPlayCardReplace(void);

/**
 * @brief 提示鉴权失败
 *
 */
extern void EventPlayAudioOfAuthenticationFailure(void);

/**
 * @brief 提示不在有效期
 *
 */
extern void EventPlayAudioOfOutOfDate(void);

/**
 * @brief 提示设备已锁定的
 *
 */
extern void EventPlayAudioOfDeviceLocked(void);

/**
 * @brief 提示授权已到期
 *
 */
extern void EventPlayLicenseExpiredSoundEffects(void);

/**
 * @brief 提示授权即将到期
 *
 * @param Days - 剩余天数
 */
extern void EventPlayExpirationReminder(uint8_t Days);

/**
 * @brief 提示设备处于初始化状态
 *
 */
extern void EventPlayDeviceNotAuthorized(void);

/**
 * @brief 提示设置参数失败
 *
 */
extern void EventPlaySetParameterError(void);

/**
 * @brief 提示设置参数成功
 *
 */
extern void EventPlaySetParameterSuccess(void);

/**
 * @brief 提示退出验证模式
 *
 */
extern void EventPlayExitVerificationMode(void);

/**
 * @brief 提示验证用户权限
 *
 */
extern void EventPlayVerifyUserPermissions(void);

/**
 * @brief 提示验证管理员密码
 *
 */
extern void EventPlayVerifyAdminPassword(void);

/**
 * @brief 提示设备繁忙
 *
 */
extern void EventPlayEquipmentBusyStatus(void);

/**
 * @brief 提示提示注册用户数量
 *
 * @param SuccessCount - 成功数量
 * @param FailureCount - 失败数量
 */
extern void EventPlayRegisterUserCount(uint8_t SuccessCount, uint8_t FailureCount);

/**
 * @brief 提示启动在线注册注册用户
 *
 */
extern void EventPlayStartOnlineRegisterUser(void);

/**
 * @brief 提示文件下发中
 *
 */
extern void EventPlayInitiateDocumentReceipt(void);

/**
 * @brief 提示低电量
 *
 */
extern void EventPlayLowBattery(void);

/**
 * @brief 提示用户执行关锁动作
 *
 */
extern void EventPlayUserExecutelockAction(void);

/**
 * @brief 提示门锁已打开
 *
 */
extern void EventPlayDoorUnlock(void);

/**
 * @brief 提示门锁已关闭
 *
 */
extern void EventPlayDoorLock(void);

/**
 * @brief 提示门锁已处于常开模式
 *
 */
extern void EventPlayDoorNormallyOpen(void);

/**
 * @brief 提示设备自检失败
 *
 * @param ErrorCode - 错误码
 */
extern void EventPlaySelfTestError(uint8_t ErrorCode);

/**
 * @brief 提示本地注册模式
 *
 */
extern void EventPlayExitLocalRegister(void);

/**
 * @brief 提示本地注册状态
 *
 * @param RegisterStatus - 注册状态
 */
extern void EventPlayLocalRegisterStatus(bool RegisterStatus);

/**
 * @brief 提示启动网络附着
 * 
 */
extern void EventPlayNetAttachStart(void);

/**
 * @brief 提示网络附着结束
 * 
 */
extern void EventPlayNetAttachEnd(void);

/**
 * @brief 提示网络附着状态
 * 
 * @param Status - 附着状态（true：附着 false：未附着）
 */
extern void EventPlayNetAttachStatus(uint8_t Status);

/**
 * @brief 提示设备进入待机模式
 *
 */
extern void EventPlayIntoStandbyMode(void);

/**
 * @brief 提示设备退出待机模式
 *
 */
extern void EventPlayExitStandbyMode(void);

/**
 * @brief 电机上电初始化
 *
 */
extern void EventMotorPowerUpInitialization(void);

/**
 * @brief 重置网络状态
 *
 */
extern void EventResetNetworkStatus(void);

/**
 * @brief 执行上锁
 *
 */
extern void EventExecuteDoorLock(void);

/**
 * @brief 执行开锁
 *
 */
extern void EventExecuteDoorUnlock(void);

/**
 * @brief 执行常开
 *
 */
extern void EventExecuteDoorNormalOpen(void);

/**
 * @brief 更新离合器状态
 *
 * @param NewStatus    - 新状态
 */
extern void EventUpdateClutchStatus(uint8_t NewStatus);

/**
 * @brief 判断是否需要关闭提示
 *
 * @param UnlockType - 开锁类型
 * @return bool      - 提示使能位（true：是 false：否）
 */
extern bool EventDetermineIfLockOffPromptIsRequired(uint8_t UnlockType);

/**
 * @brief 获取网络质量
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventGetNetworkQuality(void);

/**
 * @brief 创建用户
 *
 * @param pRegisterKeyInformationIn - 注册密钥信息
 * @return RegisterResult_t         - 注册结果
 */
extern RegisterResult_t EventCreateNewKey(RegisterKeyInformation_t *pRegisterKeyInformationIn);

/**
 * @brief 验证管理员密码
 * 
 * @param pPasswordIn                 - 待验证的密码键值
 * @param NumberOfPassword            - 待验证的密码键值长度
 * @return UserAuthenticationResult_t - 鉴权结果
 */
// extern UserAuthenticationResult_t EventVerifyAdministratorPassword(const void *pPasswordIn, uint8_t NumberOfPassword);

/**
 * @brief 鉴定用户权限
 *
 * @param KeyType                     - 待验证密码类型
 * @param pKeyValueIn                 - 密钥值
 * @param NumberOfKey                 - 密钥数量
 * @param pTranslatedKeyTypeOut       - 转译后的密钥类型
 * @param pKeyTokenOut                - 密钥唯一编码
 * @param pEndTimesampOut             - 到期时间
 * @return UserAuthenticationResult_t - 鉴权结果
 */
// extern UserAuthenticationResult_t EventUserAuthentication(uint8_t KeyType, const void *pKeyValueIn, uint8_t NumberOfKey, uint8_t *pTranslatedKeyTypeOut, uint32_t *pKeyTokenOut, uint32_t *pEndTimesampOut);

/**
 * @brief 写用户鉴权日志
 *
 * @param KeyType     - 密钥类型
 * @param pKeyValueIn - 密钥值
 * @param Status      - 鉴权状态
 * @return uint16_t   - 写日志编码
 */
extern uint16_t EventWriteUserAuthenticationLogFile(const uint8_t KeyType, const uint8_t *pKeyValueIn, uint8_t Status);

/**
 * @brief 写设备上电日志
 *
 */
extern void EventWriteDeviceStartupLogFile(void);

/**
 * @brief 写常开状态日志
 *
 * @param TiggerEn  - 触发标识
 * @return uint16_t - 写日志编码
 */
extern uint16_t EventWriteNormalOpenTiggerStatusLogFile(bool TiggerEn);

/**
 * @brief 获取是否存在待推送的日志
 *
 * @return bool - 是否存在待推送的日志（true:存在, false:不存在）
 */
extern bool EventGetWhetherThereAreLogsToBePushed(void);

/**
 * @brief 删除所有日志文件
 *
 */
extern void EventDeleteAllLogFile(void);

/**
 * @brief 判断在线注册方式是否为主机推送
 * 
 * @param PushSource - 推送源
 * @return bool      - 是否为主机推送（true：是 false：否）
 */
extern bool EventDetermineWhetherTheOnlineRegistrationMethodIsHostPush(uint8_t PushSource);

/**
 * @brief 上报在线注册用户结果
 * 
 * @param pRegisterKeyInformationIn - 注册密钥信息
 * @param RegisterResult            - 注册结果
 */
extern void EventUploadOnlineRegisterResult(RegisterKeyInformation_t *pRegisterKeyInformationIn, RegisterResult_t RegisterResult);

/**
 * @brief 实时推送开锁事件
 *
 * @param LogId       - 日志ID
 * @param KeyType     - 密钥类型
 * @param pKeyValueIn - 密钥值
 */
extern void EventRealTimePushOfUnlockEvent(uint16_t LogId, uint8_t KeyType, const uint8_t *pKeyValueIn);

/**
 * @brief 实时推送警报事件
 *
 * @param LogId      - 日志ID
 * @param AlarmEvent - 警报事件
 * @param TiggerEn   - 触发状态
 */
extern void EventRealTimePushOfAlarmEvent(uint16_t LogId, uint8_t AlarmEvent, uint8_t TiggerEn);

/**
 * @brief 更新蓝牙广播包
 *
 */
extern void EventUpdateBluetoothRadio(void);

/**
 * @brief 删除所有持卡人
 *
 */
extern void EventDeleteAllCardholder(void);

/**
 * @brief 恢复默认用户参数
 *
 */
extern void EventRestoreDefaultUserParameters(void);

/**
 * @brief 初始化设备参数
 *
 * @return bool - 初始化状态（true：初始化成功 false：初始化失败）
 */
extern bool EventInitialisingDeviceParameters(void);

/**
 * @brief 启动外部验证
 *
 * @return bool - 启动状态（true：启动成功 false：启动失败）
 */
extern bool EventStartExternalValidation(void);

/**
 * @brief 验证模组进入掉电模式
 *
 */
extern void EventSafetyModuleIntoPowerDown(void);

/**
 * @brief 删除外部模组特定密钥
 *
 * @param pKeyValueIn - 密钥信息
 */
extern void EventSafetyModuleDeleteSpecificKey(const uint8_t *pKeyValueIn);

/**
 * @brief 向服务器发送心跳
 *
 */
extern void EventSendHeartbeatToServer(void);

/**
 * @brief 主动向服务器发送心跳
 *
 */
extern void EventActivePushHeartbeatToHost(void);

/**
 * @brief 强制结束信息发送
 *
 */
extern void EventForceEndMessageSend(void);

/**
 * @brief 禁用卡片识读功能
 *
 */
extern void EventDisableRfidFunction(void);

/**
 * @brief 使能卡片识读功能
 *
 */
extern void EventEnableRfidFunction(void);

/**
 * @brief 禁用键盘
 *
 */
extern void EventDisableKeyboardFunction(void);

/**
 * @brief 使能键盘
 *
 */
extern void EventEnableKeyboardFunction(void);

/**
 * @brief RFID 退出当前模式
 *
 */
extern void EventRfidExitCurrectMode(void);

/**
 * @brief 获取指示灯是否开启
 *
 * @return bool - 指示灯状态(true：开启 false：关闭)
 */
extern bool EventCheckIfTheIndicatorLightIsOn(void);

/**
 * @brief 睡眠前的动作
 *
 */
extern void EventActionBeforeSleep(void);

/**
 * @brief 软件复位
 *
 */
extern void EventSoftwareReset(void);

/**
 * @brief 失能所有传感器
 *
 */
extern void EventDisableAllInterrupt(void);

/**
 * @brief 使能所有传感器
 *
 */
extern void EventEnableAllInterrupt(void);

/**
 * @brief 分配所需的内存空间
 *
 * @param MallocSize - 内存块的大小，以字节为单位
 * @return uint8_t*  - 指向已分配大小的内存。如果请求失败，则返回 NULL
 */
extern uint8_t *EventMalloc(uint16_t MallocSize);

/**
 * @brief 释放已分配的内存
 *
 * @param ptr - 指针指向一个要释放内存的内存块
 */
extern void EventFree(void *ptr);

/**
 * @brief 启动任务调度
 *
 */
extern void EventStopTaskSchedule(void);

/**
 * @brief 启动任务调度
 *
 */
extern void EventStartTaskSchedule(void);

/**
 * @brief 停止定时任务
 *
 */
extern void EventStopScheduleTask(void);

/**
 * @brief 延时定时任务
 *
 * @param DelayTime - 延时的时间
 */
extern void EventDelayedStartScheduleTask(uint32_t DelayTime);

/**
 * @brief 立即启动定时任务
 *
 */
extern void EventStartScheduleTaskNoWait(void);

/**
 * @brief 停止设备重启任务
 *
 */
extern void EventStopDeviceRebootTask(void);

/**
 * @brief 延时启动设备重启任务
 *
 * @param DelayTime -延时的时间
 */
extern void EventDelayedStartDeviceRebootTask(uint32_t DelayTime);

/**
 * @brief 停止设备恢复出厂任务
 *
 */
extern void EventStopRestoreFactoryTask(void);

/**
 * @brief 延时启动设备恢复出厂任务
 *
 * @param DelayTime -延时的时间
 */
extern void EventDelayedStarRestoreFactoryTask(uint32_t DelayTime);

/**
 * @brief 立即执行设备恢复出厂任务
 *
 */
extern void EventStartRestoreFactoryTaskNoWait(void);

/**
 * @brief 停止进入固件更新任务
 *
 */
extern void EventStopIntoFirmwareUpdateTask(void);

/**
 * @brief 延时启动固件升级任务
 *
 * @param DelayTime - 延时的时间
 */
extern void EventDelayedStartIntoFirmwareUpdateTask(uint32_t DelayTime);

/**
 * @brief 立即进入固件更新任务
 *
 */
extern void EventStartIntoFirmwareUpdateTaskNoWait(void);

/**
 * @brief 停止设备自检任务
 *
 */
extern void EventStopDeviceSelfTestTask(void);

/**
 * @brief 延时启动设备自检任务
 *
 * @param DelayTime - 延时的时间
 */
extern void EventDelayedStartDeviceSelfTestTask(uint32_t DelayTime);

/**
 * @brief 立刻启动设备自检任务
 *
 */
extern void EventStartDeviceSelfTestTaskNoWait(void);

/**
 * @brief 向事件中心抛掷事件
 *
 * @param Event    - 事件类型
 * @param pDataIn  - 附带数据
 * @param DataSize - 附带数据长度
 * @return bool    - 抛掷状态（true：成功 false：失败）
 */
extern bool ThrowEventToEventCenter(uint8_t Event, const void *pDataIn, uint8_t DataSize);

/**
 * @brief 事件处理中心板载功能初始化
 *
 * @param pExternalInterfaces - 外部调用方法
 */
extern void EventCenterBoardInitialisation(EventCenterExternalInterfaces_t *pExternalInterfaces);

#endif
